#include "LinkedQueueStack.h"
#include <stdio.h>
#include <stdlib.h>


void InitQueue_LQ(LQueue &Q)//构造一个空队列Q
{
    Q.front=NULL;
    Q.rear=NULL;

}
Status DestroyQueue_LQ(LQueue &Q)//销毁队列Q
{
    if( !Q.front )
        return ERROR ;
    else
    {
        while( Q.front )
        {
            Q.rear = Q.front->next ;
            free( Q.front ) ;
            Q.front = Q.rear ;
        }
        return OK ;
    }
}
Status QueueEmpty_LQ(LQueue Q)//若队列Q为空，则返回TRUE，否则返回FALSE
{
    if (Q.front)return FALSE;
    else return TRUE;
}
int QueueLength_LQ(LQueue Q)//返回队列Q中元素个数，即队列的长度
{
    int count=0;
    CustNode *p = Q.front ;
    while( p )
    {
        count++;
        p = p->next ;
    }
    return count;
}
Status GetHead_LQ(LQueue Q,double &amount)//若队列不空,则用e返回Q的队头元素,并返回OK;否则返回ERROR
{
    if(Q.front == Q.rear)
        return FALSE;
    //获取队头的第一个有效结点
    CustNode *p = Q.front;
    //返回队头第一个有效结点数据
    amount = p->amount;
    return OK;
}
Status EnQueue_LQ(LQueue &Q,CustNode *pt)//在队列Q的队尾插入结点node
{
    //srand(time(NULL));
//    CustNode *p;
//    p=(CustNode*)malloc(sizeof(CustNode));
//    if(NULL==p)return OVERFLOW;
    pt->next=NULL;
    if(NULL==Q.front)Q.front=pt; //将pt所指向的结点插人空队列
    else Q.rear->next=pt; //e插人非空队列
    Q.rear=pt; //队尾指针指向新的队尾
    return OK;
}


CustNode * DeQueue_LQ(LQueue &Q)//若队列Q非空,返回头结点的指针
{
    CustNode *p;
    if(NULL==Q.front)return ERROR;
    p=Q.front;//指向队头结点
    //printf("before%x\n",Q.front);
    //e=p->data;//保存队头结点的数据
    Q.front=p->next;
    //printf("after%x\n",Q.front);

    if(Q.rear==p)Q.rear=NULL;//队列只有一个结点,删去后队列变空
    //free(p);//释放被删队头结点
    p->next=NULL;
    return p;
}